package com.beyondsoft.common.activiti.service;

import com.beyondsoft.common.activiti.model.CommentData;
import com.beyondsoft.common.activiti.model.HistoryData;
import com.beyondsoft.common.activiti.model.TaskData;
import com.beyondsoft.common.activiti.model.WorkflowTaskData;

import java.util.List;
import java.util.Map;

/**
 * @author zhangyan
 * @version $ Id: WorkflowService.java, v 0.1 2020/6/20 11:42 zhangyan Exp $
 */
public interface WorkflowService {

    /**
     * 发起流程
     *
     * @param procDefKey 流程定义编号
     * @return
     */
    String startByKey(String procDefKey);

    /**
     * 发起流程
     *
     * @param authenticateUserId 流程发起用户信息
     * @param procDefKey         流程定义编号
     * @return
     */
    String startByKey(String authenticateUserId, String procDefKey);

    /**
     * 发起流程
     *
     * @param authenticateUserId 流程发起用户信息
     * @param procDefKey         流程定义编号
     * @param businessKey        业务编号
     * @return
     */
    String startByKey(String authenticateUserId, String procDefKey, String businessKey);

    /**
     * 发起流程
     *
     * @param authenticateUserId 流程发起用户信息
     * @param procDefKey         流程定义编号
     * @param businessKey        业务编号
     * @param variables          流程变量
     * @return
     */
    String startByKey(String authenticateUserId, String procDefKey, String businessKey, Map<String, Object> variables);

    /**
     * 启动流程
     *
     * @param processDefinitionId
     * @return
     */
    String startById(String processDefinitionId);

    /**
     * 启动流程
     *
     * @param processDefinitionId
     * @return
     */
    String startById(String authenticateUserId, String processDefinitionId);

    /**
     * 启动流程
     *
     * @param processDefinitionId
     * @return
     */
    String startById(String authenticateUserId, String processDefinitionId, String businessKey);

    /**
     * 启动流程
     *
     * @param authenticateUserId
     * @param processDefinitionId
     * @param businessKey
     * @param variables
     * @return
     */
    String startById(String authenticateUserId, String processDefinitionId, String businessKey, Map<String, Object> variables);

    /**
     * 处理任务
     *
     * @param taskId 任务编号
     */
    void complete(String taskId);

    /**
     * 处理任务
     *
     * @param taskId    任务编号
     * @param variables 变量参数
     */
    void complete(String taskId, Map<String, Object> variables);

    /**
     * 处理任务
     *
     * @param taskId     任务编号
     * @param variables  变量参数
     * @param procInstId 流程实例编号
     * @param message    审批意见
     * @param assignee   处理人
     */
    void complete(String taskId, Map<String, Object> variables, String procInstId, String message, String assignee);

    /**
     * 指派
     *
     * @param taskId
     * @param userId
     */
    void claim(String taskId, String userId);

    /**
     * 取消指派
     *
     * @param taskId
     */
    void unClaim(String taskId);

    /**
     * 查询流程信息
     *
     * @param taskId 任务编号
     * @return
     */
    WorkflowTaskData queryTaskById(String taskId);

    /**
     * 查询流程信息
     *
     * @param procInstId 流程实例编号
     * @return
     */
    WorkflowTaskData queryTaskByProcInstId(String procInstId);

    /**
     * 查询组任务
     *
     * @param groupId
     * @return
     */
    List<WorkflowTaskData> queryGroupTask(String groupId);

    /**
     * 根据业务主键查询流程信息
     *
     * @param businessKey 业务编号
     * @return
     */
    WorkflowTaskData queryTaskByBusinessKey(String businessKey);

    /**
     * 审批意见列表
     *
     * @param procInstId 流程实例id
     * @return
     */
    List<CommentData> queryMessageByProcInstId(String procInstId);

    /**
     * 查询历史流程
     *
     * @param procInstId 流程实例id
     * @param taskId
     * @return
     */
    List<HistoryData> queryHistoryTaskDefKeyByProcInstId(String procInstId, String taskId);

    /**
     * 跳转至指定活动节点
     *
     * @param taskId
     * @param toNodeId
     * @throws Exception
     */
    void jump(String taskId, String toNodeId, String procInsId, String message, String assignee);

    /**
     * 跳转至指定活动节点
     *
     * @param taskId
     * @param toNodeId
     * @throws Exception
     */
    void jump(String taskId, String toNodeId);

    /**
     * 判断是否挂起状态
     *
     * @param procInstId 流程实例id
     * @return
     */
    boolean isSuspended(String procInstId);

    /**
     * 挂起任务
     *
     * @param procInstId
     */
    void suspendByProcessId(String procInstId);

    /**
     * 删除流程
     *
     * @param procInstId 流程实例编号
     * @param reason     原因
     * @param assignee   处理人
     */
    void deleteProcessInstance(String procInstId, String reason, String assignee);

    /**
     * 查询用户待办任务列表。
     *
     * @param assignee 用户
     * @return 任务列表
     */
    List<TaskData> queryToDoTasks(String assignee);

    /**
     * 查询已办
     *
     * @param assignee 用户
     * @return 任务列表
     */
    List<TaskData> queryDoneTasks(String assignee);

    /**
     * 我发起的
     *
     * @param assignee 用户
     * @return 任务列表
     */
    List<TaskData> queryUserLaunchTask(String assignee);


    /****************************************************************以下是会签方法********************************************************************************/
    /****************************************************************以下是会签方法********************************************************************************/

}
